///////////////////////////////////////////////////////////////////////////////

#ifndef _CLIENTBATTLEFIELD_H_
#define _CLIENTBATTLEFIELD_H_

////////////////////////////////////////////////////////////////////////////////

#ifndef _BATTLEFIELD_H_
#include "battlefield.h"
#endif

#include <algorithm>

////////////////////////////////////////////////////////////////////////////////

class ServerState;

////////////////////////////////////////////////////////////////////////////////

/** Battlefield representation on client side.
*
*  @author   Anastasia Karpinska
*  @since    Nov 12th, 2009
*  @updated  Nov 12th, 2009
*/
class ClientBattlefield : public Battlefield
{
////////////////////////////////////////////////////////////////////////////////

public:

////////////////////////////////////////////////////////////////////////////////

    /** Constructor */
    ClientBattlefield();


    /** Destructor */
    ~ClientBattlefield();


    /** Apply battlefield from past */
    void Integrate( const ServerState& _next, double _alpha );


////////////////////////////////////////////////////////////////////////////////

private:

////////////////////////////////////////////////////////////////////////////////


    /** Integrate bullets and put them to container */
    template<typename TObj>
    void IntegrateObject( TObj& _curObjects,
                          const TObj& _nextObjects,
                          double _alpha )

{
    for ( typename TObj::iterator itCur = _curObjects.begin(); itCur != _curObjects.end(); ++itCur )
    {
        typename TObj::const_iterator itNext = std::find(_nextObjects.begin(), _nextObjects.end(), *itCur);
        if ( itNext != _nextObjects.end() )
        {
            PE::Point nextPosition;
            nextPosition.x = itCur->GetPosition().x * _alpha + itNext->GetPosition().x * (1.0 - _alpha);
            nextPosition.y = itCur->GetPosition().y * _alpha + itNext->GetPosition().y * (1.0 - _alpha);
            itCur->SetPosition(nextPosition);
        }
    }
}


////////////////////////////////////////////////////////////////////////////////

};

////////////////////////////////////////////////////////////////////////////////

#endif
